/*
 * dgram.c
 * support functions for datagram based programs
 */
#include	<stdio.h>
#include	<unistd.h>
#include	<sys/types.h>
#include	<sys/socket.h>
#include	<netinet/in.h>
#include	<arpa/inet.h>
#include	<netdb.h>
#include	<string.h>

#define	HOSTLEN	256

int	make_internet_address();

int	make_dgram_server_socket(int	portnum)
{
	struct	sockaddr_in	saddr;					/* build our address here */
	char	hostname[HOSTLEN];					/* address */
	int	sock_id;						/* the socket */

	sock_id = socket(PF_INET, SOCK_DGRAM, 0);			/* get a socket */
	if (sock_id == -1) return -1;

	/* build address and bind it to socket */
	gethostname(hostname, HOSTLEN);					/* where am I? */
	make_internet_address(hostname, portnum, &saddr);

	if (bind(sock_id,(struct sockaddr *)&saddr, sizeof(saddr)) != 0)
		return -1;
	return	sock_id;
}

int	make_dgram_client_socket()
{
	return	socket(PF_INET, SOCK_DGRAM, 0);
}

int	make_internet_address(char *hostname, int port, struct sockaddr_in *addrp)
/*
 * constructor for an Internet socket address, uses hostname and port
 * (host,port) -> *addrp
 */
{
	struct	hostent	*hp;

	bzero((void *)addrp, sizeof(struct sockaddr_in));
	hp = gethostbyname(hostname);
	if (hp == NULL) return -1;
	bcopy((void *)hp -> h_addr, (void *)&addrp->sin_addr, hp->h_length);
	addrp->sin_port = htons(port);
	addr->sin_family = AF_INET;
	return 0;
}

int	get_internet_address(char *host, int len, int *portp, struct sockaddr_in *addrp)
/*
 * extracts host and port from an internet socket address
 * *addrp->(host,port)
 */
{
	strncpy(host, inet_ntoa(addrp->sin_addr), len);
	*portp = ntohs(addrp->sin_port);
	return 0;
}
